#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'wshu'
__version__ = '1.0'
"""
    ***********************************
    *  @filename : settings.py
    *  @Author : wshu
    *  @CodeDate : 2020/3/26 11:08
    *  @Software : PyCharm
    ***********************************
"""
from utils.UserAgentList import get_user_agent

BOT_NAME = 'hfbot_v1'

SPIDER_MODULES = ['hfbot_v1.spiders']
NEWSPIDER_MODULE = 'hfbot_v1.spiders'

# -----------_-__-_-------------
# -----------基本配置------------
# -----------_-__-_-------------
# 采用robots.txt策略
ROBOTSTXT_OBEY = False
# 最大并发请求（默认值：16）
CONCURRENT_REQUESTS = 100
# 为同一网站的请求配置延迟(默认: 0)
# 下载器在下载同一个网站下一个页面前需要等待时间,该选项限制爬虫爬取速度,减轻服务器压力
DOWNLOAD_DELAY = 0
# 对单个网站进行并发请求的最大值
CONCURRENT_REQUESTS_PER_DOMAIN = 100
# 对单个IP进行并发请求的最大值
# 如果非0,则忽略 CONCURRENT_REQUESTS_PER_DOMAIN 设定,使用该设定
# 也就是说,并发限制将针对IP,而不是网站,
# 该设定也影响 DOWNLOAD_DELAY: 如果 CONCURRENT_REQUESTS_PER_IP 非0,
# 下载延迟应用在IP而不是网站上。
CONCURRENT_REQUESTS_PER_IP = 100
# 初始下载延迟
AUTOTHROTTLE_START_DELAY = 2
# 在高延迟情况下设置的最大下载延迟
AUTOTHROTTLE_MAX_DELAY = 20
# 禁用Cookie（默认情况下已启用）
COOKIES_ENABLED = True
# 禁用Telnet控制台（默认启用）
#TELNETCONSOLE_ENABLED = False
# 过滤不成功的http响应
HTTPERROR_ALLOWED_CODES = [404]
# 重写默认请求头:
#DEFAULT_REQUEST_HEADERS = {
#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
#   'Accept-Language': 'en',
#}
# -----------_-__-_-------------
# -----------爬取配置------------
# -----------_-__-_-------------
# 爬取深度
DEPTH_LIMIT = 6
# 爬虫通常为: DFO(深度优先爬取) BFO(广度优先爬取)
# Scrapy 默认情况下是广度优先爬取,如果需要BFO模式,需要以下设置
# (说明): 如果配置值DEPTH_PRIORITY设置为1, 则请求的优先级会递减(0,-1,-2...)
# (说明): 如果配置值DEPTH_PRIORITY设置为-1, 则请求的优先级会递增(0,1, 2...)
# 通过这方式, 通过改变配置的正负值, 来实现优先级的控制(深度优先(从大到小), 广度优先(从小到大))
DEPTH_PRIORITY = 1
# SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
# SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'
# 数据丢失时下载失败
DOWNLOAD_FAIL_ON_DATALOSS = False
# 启用ajax动态爬取
AJAXCRAWL_ENABLED = True
# 爬虫最大页面限制
CLOSESPIDER_PAGECOUNT = 500
# 爬虫开启时间超过设定值，将会自动关闭. 默认0
# CLOSESPIDER_ITEMCOUNT = 5
# 爬虫指定多个项目超出指定数量关闭爬虫.
# CLOSESPIDER_TIMEOUT = 10
# 爬虫出错统计
# CLOSESPIDER_ERRORCOUNT = 0
# 下载器超时
DOWNLOAD_TIMEOUT = 2
# 重试次数
RETRY_TIMES = 2

#设置图片下载路径
IMAGES_STORE = ''   # E:\\media

IMAGES_MIN_HEIGHT = 100  # 设定下载图片的最小高度
IMAGES_MIN_WIDTH = 100  # 设定下载图片的最小宽度

# 过期天数(10天内抓取过的不会被重抓)
IMAGES_EXPIRES = 10

# -----------_-__-_-------------
# -----------分布配置------------
# -----------_-__-_-------------
# todo: 任务分发与调度，所有爬虫开始的请求放在redis里，所有爬虫都去redis里读取请求
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

# todo: 去重队列，负责所有请求去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

# todo: 使用redis set类型，简单去重(默认会用list)
REDIS_START_URLS_AS_SET = True

# todo: 默认队列(先放入redis的会重新爬取)
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderQueue'

# todo: 栈(后放入redis的请求会重新爬取)
# SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderStack'

# todo: 不清理redis队列
# True: redis中URL不会被scrapy_redis清理掉
# todo: 优点：爬虫停止了在重新启动，会从上一次暂停的地方开始继续爬取
# todo: 弊端：如果有多个爬虫都要从这读取URL，需要单独一个程序维护防止重爬
# False: redis中URL会被scrapy_redis清理掉
# todo: 优点: 多个服务器爬虫不会拿到同一个URL，不会出现重复爬取
# todo: 弊端: 爬虫暂停后重启，会重新开始爬取
SCHEDULER_PERSIST = True

# 优先级队列
# todo: 根据优先级算法计算哪些请求先爬取，哪些请求后爬取
# todo: 这个优先级算法比较复杂，会综合考虑请求的深度等各个因素
# SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue'

# todo: redis基本配置
REDIS_HOST = '10.101.1.235'    # 修改为实际的地址
REDIS_PORT = 6379              # 修改为实际的端口
REDIS_PARAMS = {
    'password': 'cecgw@12345',
    'db': 8
}

# -----------_-__-_-------------
# -----------中间件--------------
# -----------_-__-_-------------
# 启用或禁用爬虫中间件
#SPIDER_MIDDLEWARES = {
#    'hfbot_v1.middlewares.HfbotV1SpiderMiddleware': 543,
#}

# 启用或禁用下载中间件
DOWNLOADER_MIDDLEWARES = {
   'hfbot_v1.hfmiddlewares.downloadmiddleware.HfProxyMiddleware': 543,   # 代理
}

# -----------_-__-_-------------
# -------------扩展--------------
# -----------_-__-_-------------
# 启用或禁用扩展
EXTENSIONS = {
   'scrapy.extensions.telnet.TelnetConsole': None,
}

# -----------_-__-_-------------
# ------------管道---------------
# -----------_-__-_-------------
# 配置项目管道
ITEM_PIPELINES = {
   'hfbot_v1.pipelines.HfbotV1Pipeline': 300,
}

# -----------_-__-_-------------
# --------AutoThrottle----------
# -----------_-__-_-------------
# 启用和配置AutoThrottle扩展(默认情况下禁用)
#AUTOTHROTTLE_ENABLED = True
# 初始下载延迟
#AUTOTHROTTLE_START_DELAY = 5
# 高延迟情况下设置的最大下载延迟
#AUTOTHROTTLE_MAX_DELAY = 60
# Scrapy应并行发送的平均请求数
# 每个远程服务器
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# 启用显示收到的每个响应的限制状态
#AUTOTHROTTLE_DEBUG = False

# -----------_-__-_-------------
# -----------数据库-----------
# -----------_-__-_-------------
MYSQL_CONF = {
    "MYSQL_HOST": '10.101.1.235',      # 地址
    "MYSQL_PORT": 3306,     # 端口
    "MYSQL_DB": 'monitor',     # 数据库
    "MYSQL_USER": 'root',      # 用户名
    "MYSQL_PWD": 'Ws123456,mysql',    # 密码
    "MYSQL_CHARSET": 'utf8',
}

# -----------_-__-_-------------
# -----------UA配置--------------
# -----------_-__-_-------------
# 随机读取系统配置好的 user_agent
USER_AGENT = get_user_agent()